package ig.util.ejb;

import ig.util.excepciones.IGExcepcion;



import java.rmi.RemoteException;

import java.sql.SQLException;



import javax.ejb.EJBException;

import javax.ejb.EntityBean;

import javax.ejb.EntityContext;

import javax.ejb.RemoveException;

import javax.naming.NamingException;

/**
 * Define el comportamiento basico que posee todo Bean de Entidad dentro de
 * la aplicacion.
 * @author lfgarcia
 */
public abstract class IGEntityBean extends IGBean implements EntityBean {

    protected EntityContext ctx;
    protected IGLlavePrimaria pk;

    public void setEntityContext(EntityContext ctx) throws EJBException, RemoteException {
        this.ctx = ctx;
    }

    public void unsetEntityContext() throws EJBException, RemoteException {
        this.ctx = null;
        this.pk=null;
    }
    
        
    public void ejbActivate() {
    }

    public void ejbPassivate() {
    }

    /**
     * En este metodo debe especificarse que atributos cargar y como se debe realizar este
     * proceso para cada Bean de Entidad.
     * @throws IGExcepcion Si se presenta un error propio de la aplicacion.
     * @throws NamingException Si se presenta un error con JNDI.
     * @throws SQLException Si se presenta un error con la base de datos.
     * @throws Exception Si se presenta cualquier otro error.
     */
    public abstract void cargarEntidad() throws IGExcepcion, NamingException, SQLException, Exception;

    /**
     * Se encarga de cargar los atributos basicos y compuestos que posee el Bean.
     * En terminos generales este metodo no debe alterarse, la especificacion de
     * que atributos cargar y como hacerlo se debe realizar en el metodo
     * cargarDatosBasicos.
     */
    public void ejbLoad() {
        try {
            pk = (IGLlavePrimaria) ctx.getPrimaryKey();
        } catch (Exception e) {
            System.out.println("Error tratando de Obtener Llave Primaria!\n");
            e.printStackTrace();
        }


        try {

            cargarEntidad();

        } catch (IGExcepcion e) {
            e.printStackTrace();
            System.out.println("Error al Intentar Cargar la Entidad!\n");
            throw new EJBException("No fue posible cargar la entidad " + pk.toString() +
                    " debido a un problema con la carga de la informacion " + e.toString());
        } catch (SQLException e) {
            e.printStackTrace();
            throw new EJBException("No fue posible cargar la entidad " + pk.toString() +
                    " debido a un error de conexion con la bd. " + e.toString());
        } catch (Exception e) {
            e.printStackTrace();
            throw new EJBException("No fue posible cargar la entidad " + pk.toString() + e.toString());
        } finally {
            try {
                if (pstmt1 != null) {
                    pstmt1.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

            try {
                if (pstmt2 != null) {
                    pstmt2.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

            try {
                if (pstmt3 != null) {
                    pstmt3.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

            try {
                if (pstmt4 != null) {
                    pstmt4.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

            try {
                if (pstmt5 != null) {
                    pstmt5.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

            try {
                if (conn != null && !conn.isClosed()) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

    public abstract void actualizarEntidad() throws NamingException, SQLException, IGExcepcion;

    /**
     * Se encarga de hacer persistente la informacion de un Bean de Entidad.
     */
    public void ejbStore() {

        IGLlavePrimaria pk = null;

        try {
            actualizarEntidad();

        } catch (IGExcepcion e) {
            throw new EJBException("No fue posible actualizar la entidad " + pk.toString() +
                    " debido a un problema con la carga de la informacion " + e.toString());
        } catch (SQLException e) {
            e.printStackTrace();
            throw new EJBException("No fue posible actualizar la entidad " + pk.toString() +
                    " debido a un error de conexion con la bd. " + e.toString());
        } catch (Exception e) {
            throw new EJBException("No fue posible actualizar la entidad " + pk.toString() + e.toString());
        } finally {
            try {
                if (pstmt1 != null) {
                    pstmt1.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

            try {
                if (pstmt2 != null) {
                    pstmt2.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

            try {
                if (pstmt3 != null) {
                    pstmt3.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }

            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

    }

    public abstract void eliminarEntidad() throws NamingException, SQLException, Exception;

    public void ejbRemove() throws RemoveException {

        IGLlavePrimaria pk = null;

        try {

            eliminarEntidad();

        } catch (IGExcepcion e) {
            throw new EJBException("No fue posible eliminar la entidad " + pk.toString() +
                    " debido a un problema con la carga de la informacion " + e.toString());
        } catch (SQLException e) {
            throw new EJBException("No fue posible eliminar la entidad " + pk.toString() +
                    " debido a un error de conexion con la bd. " + e.toString());
        } catch (Exception e) {
            throw new EJBException("No fue posible eliminar la entidad " + pk.toString() + e.toString());
        } finally {
            try {
                if (pstmt1 != null) {
                    pstmt1.close();
                }
            } catch (SQLException e) {
            }

            try {
                if (pstmt2 != null) {
                    pstmt2.close();
                }
            } catch (SQLException e) {
            }

            try {
                if (pstmt3 != null) {
                    pstmt3.close();
                }
            } catch (SQLException e) {
            }

            try {
                if (conn != null) {
                    conn.close();
                }
            } catch (SQLException e) {
            }
        }
    }
}

